// 《围棋》作者版权所有。保留所有权利。
// 此源代码的使用受BSD样式
// 许可证的约束，该许可证可以在许可证文件中找到。

package sort

// Slice根据提供的less函数对切片x进行排序。
// 如果x不是一片，它会恐慌。
// 
// 排序不保证稳定：相等元素
// 可能会从其原始顺序反转。
// 要获得稳定排序，请使用SliceStable。
// 
// less函数必须满足与
// 接口类型的less方法相同的要求。
func Slice(x any, less func(i, j int) bool) {
	rv := reflectValueOf(x)
	swap := reflectSwapper(x)
	length := rv.Len()
	quickSort_func(lessSwap{less, swap}, 0, length, maxDepth(length))
}

// SliceStable使用提供的较少的
// 函数对切片x进行排序，使相等的元素保持其原始顺序。
// 如果x不是一片，它会恐慌。
// 
// less函数必须满足与
// 接口类型的less方法相同的要求。
func SliceStable(x any, less func(i, j int) bool) {
	rv := reflectValueOf(x)
	swap := reflectSwapper(x)
	stable_func(lessSwap{less, swap}, rv.Len())
}

// SliceIsSorted报告是否根据提供的less函数对切片x进行排序。
// 如果x不是一片，它会恐慌。
func SliceIsSorted(x any, less func(i, j int) bool) bool {
	rv := reflectValueOf(x)
	n := rv.Len()
	for i := n - 1; i > 0; i-- {
		if less(i, i-1) {
			return false
		}
	}
	return true
}
